<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    function Cat(name, color) {
        this.name = name;
        this.color = color;
    }

    Cat.prototype.species = "猫";

    Cat.prototype.call = function () {
        console.log("喵喵");
    }
    Cat.prototype.skill = function () {
        console.log("捉老鼠");
    }
    Cat.prototype.say = function () {
        console.log(this.name, this.color);
    }

    console.dir(Cat);



    console.group("a");
    var Tom = new Cat("Tom", "black");
    console.log(Tom);

    // Tom.hello = "hello";
    // Cat.prototype.hello = "你好";
    // Object.prototype.hello = "我不好";

    // 在属性和方法查找的过程中: 链式查找流程
    // Tom -> Tom.__proto__(Cat.prototype) -> Cat.prototype.__proto__(Object.prototype) ->  Object.prototype.__proto__(null)

    // 1. 自己有先找自己的 (先查实例本身)   Tom = {name,age,[[prototype]]:Cat.prototype}
    console.log(Tom.name, Tom.color);

    // 2. 自己没有,顺着原型属性([[prototype]]) 找构造函数(创建Tom的构造函数)的原型对象 Cat.prototype = {constructor,[[prototype]]:Object.prototype }
    console.log(Tom.species);
    // console.log(Tom.say);
    console.log(Tom.__proto__ === Cat.prototype);


    // 3. 如果原型对象Cat.prototype上也没有, 顺着原型属性([[prototype]]),找构造函数(创建Cat.prototype的构造函数)的原型对象   => Object.prototype
    // 原理: Cat.prototype = {constructor,[[prototype]]:Object.prototype} 本质是一个对象数据, 创建该对象的是上级构造函数 Object
    console.log(Cat.prototype.__proto__ === Object.prototype);


    // 4. 如果原型对象Object.prototype上也没有, 顺着原型属性([[prototype]])  ,找构造函数(创建Object.prototype的构造函数)的原型对象   => Object.prototype  (矛盾  先有构造函数object 还是先有Object.prototype)
    console.log(Object.prototype.__proto__ === null);
    console.log(Tom.hello);

    // 问题:   
    // Object.prototype = { constructor, [[prototype]]: Object.prototype }  // (先有鸡 还是先有蛋)

    // 怎么解决?
    // 官方强制规定    Object.prototype = { constructor, [[prototype]]: null } 



    console.groupEnd("a");


    // console.group("b");
    // var Kitty = new Cat("Kitty", "pink");
    // console.log(Kitty);
    // console.groupEnd("b");


</script>

</html>